package test3;

import java.io.PrintWriter;
import java.net.ServerSocket;
import java.util.Vector;

public class Serveur extends Thread
{
	// contiendra tous les flux de sortie vers les clients
	private Vector _tabClients = new Vector(); 
	// nombre total de clients connectés
	private int _nbClients=0; 
	
	  //** Methode : la première méthode exécutée, elle attend les connexions **
	  public void run()
	  {
	    Serveur serv = new Serveur(); // instance de la classe principale
	    try
	    {
	      Integer port=new Integer(18888);	      
	  //  new Commande(serv); // lance le thread de gestion des commandes

	      // ouverture d'une socket serveur sur port
	      ServerSocket ss = new ServerSocket(port);
	      printWelcome(port);
	      while (true) // attente en boucle de connexion (bloquant sur ss.accept)
	      {
	        new ThreadClient(ss.accept(),serv); // un client se connecte, un nouveau thread client est lancé
	      }
	    }
	    catch (Exception e) { }
	  }

	  //** Methode : affiche le message d'accueil **
	  static private void printWelcome(Integer port)
	  {
	    System.out.println("--------");
	    System.out.println("BlablaServeur : Par Minosis - Minosis");
	    System.out.println("Copyright : 2004 - Minosis.com");
	    System.out.println("Derniere version : 10/04/2004");
	    System.out.println("--------");
	    System.out.println("Demarre sur le port : "+port.toString());
	    System.out.println("--------");
	    System.out.println("Quitter : tapez \"quit\"");
	    System.out.println("Nombre de connectes : tapez \"total\"");
	    System.out.println("Connexion de Thread 1 : tapez connection1");
	    System.out.println("Connexion de Thread 2 : tapez connection2");
	    System.out.println("--------");
	  }

	  //** Methode : envoie le message à tous les clients **
	  synchronized public void sendAll(String message,String sLast)
	  {
		// declaration d'une variable permettant l'envoi de texte vers le client
	    PrintWriter out; 
	    for (int i = 0; i < _tabClients.size(); i++) // parcours de la table des connectés
	    {
	      // extraction de l'élément courant (type PrintWriter)
	      out = (PrintWriter) _tabClients.elementAt(i);
	      if (out != null) // sécurité, l'élément ne doit pas être vide
	      {
	      	// ecriture du texte passé en paramètre (et concaténation d'une string de fin de chaine si besoin)
	        System.out.print(message+sLast);
	        out.flush(); // envoi dans le flux de sortie
	      }
	    }
	  }	  

	  //** Methode : détruit le client no i **
	  synchronized public void delClient(int i)
	  {
	    _nbClients--; // un client en moins ! snif
	    if (_tabClients.elementAt(i) != null) // l'élément existe ...
	    {
	      _tabClients.removeElementAt(i); // ... on le supprime
	    }
	  }

	  //** Methode : ajoute un nouveau client dans la liste **
	  synchronized public int addClient(PrintWriter out)
	  {
	    _nbClients++; // un client en plus ! ouaaaih
	    _tabClients.addElement(out); // on ajoute le nouveau flux de sortie au tableau
	    return _tabClients.size()-1; // on retourne le numéro du client ajouté (size-1)
	  }

	  //** Methode : retourne le nombre de clients connectés **
	  synchronized public int getNbClients()
	  {
	    return _nbClients; // retourne le nombre de clients connectés
	  }
}
